#!/usr/bin/env python3
"""
独立可执行文件打包脚本
使用PyInstaller创建无需依赖的独立可执行文件
"""

import os
import sys
import subprocess
import shutil

def install_pyinstaller():
    """安装PyInstaller"""
    try:
        import PyInstaller
        print("PyInstaller已安装")
        return True
    except ImportError:
        print("正在安装PyInstaller...")
        
        # 首先尝试使用国内镜像源安装
        try:
            print("尝试使用国内镜像源安装...")
            subprocess.check_call([
                sys.executable, "-m", "pip", "install", 
                "-i", "https://pypi.tuna.tsinghua.edu.cn/simple/",
                "--trusted-host", "pypi.tuna.tsinghua.edu.cn",
                "pyinstaller"
            ])
            print("使用镜像源安装成功")
            return True
        except subprocess.CalledProcessError:
            print("镜像源安装失败，尝试使用默认源安装...")
            # 镜像源失败时使用默认源重试
            try:
                subprocess.check_call([sys.executable, "-m", "pip", "install", "pyinstaller"])
                print("使用默认源安装成功")
                return True
            except subprocess.CalledProcessError:
                print("安装PyInstaller失败")
                return False

def build_executable():
    """构建独立可执行文件"""
    
    # PyInstaller命令参数
    pyinstaller_cmd = [
        "pyinstaller",
        "--onefile",  # 打包成单个文件
        "--clean",  # 清理临时文件
        "--noconfirm",  # 不确认覆盖
        "--name", "ssh-auto-upgrade",  # 可执行文件名称
        "--distpath", "dist/standalone",  # 输出目录
        "--workpath", "build",  # 工作目录
        "--specpath", ".",  # spec文件目录
        # 添加必要的隐藏导入（处理动态导入的模块）
        "--hidden-import", "systemd",
        "--hidden-import", "dbus",
        "--hidden-import", "dbus.mainloop.glib",
        "--hidden-import", "gi.repository.GLib",
        "--hidden-import", "gi.repository.Gio",
        # 排除不必要的模块以减小体积
        "--exclude-module", "matplotlib",
        "--exclude-module", "numpy",
        "--exclude-module", "pandas",
        "--exclude-module", "scipy",
        # 添加必要的二进制文件
        "--add-binary", "/usr/lib/x86_64-linux-gnu/systemd/libsystemd-shared-252.so:.",
        # 设置图标（如果有的话）
        # "--icon", "icon.ico",
        # 控制台应用（非窗口应用）
        "--console",
        # 主程序入口
        "src/ssh_auto_upgrade/main.py"
    ]
    
    try:
        print("开始构建独立可执行文件...")
        subprocess.check_call(pyinstaller_cmd)
        print("构建完成！")
        return True
    except subprocess.CalledProcessError as e:
        print(f"构建失败: {e}")
        return False

def create_distribution_package():
    """创建分发包"""
    dist_dir = "dist/standalone"
    package_dir = "dist/ssh-auto-upgrade-package"
    
    # 创建分发包目录
    if os.path.exists(package_dir):
        shutil.rmtree(package_dir)
    os.makedirs(package_dir)
    
    # 复制可执行文件
    executable_name = "ssh-auto-upgrade"
    if os.path.exists(f"{dist_dir}/{executable_name}"):
        shutil.copy(f"{dist_dir}/{executable_name}", f"{package_dir}/{executable_name}")
        # 设置可执行权限
        os.chmod(f"{package_dir}/{executable_name}", 0o755)
    
    # 创建安装脚本
    install_script = f"""#!/bin/bash
# SSH自动升级工具安装脚本

set -e

EXECUTABLE_NAME="{executable_name}"
INSTALL_DIR="/usr/local/bin"

# 检查是否为root用户
if [[ $EUID -ne 0 ]]; then
   echo "请以root用户运行此安装脚本"
   exit 1
fi

# 检查可执行文件是否存在
if [[ ! -f "$EXECUTABLE_NAME" ]]; then
    echo "错误: 找不到可执行文件 $EXECUTABLE_NAME"
    exit 1
fi

# 复制到系统目录
echo "正在安装 $EXECUTABLE_NAME 到 $INSTALL_DIR..."
cp "$EXECUTABLE_NAME" "$INSTALL_DIR/"
chmod 755 "$INSTALL_DIR/$EXECUTABLE_NAME"

# 创建systemd服务（可选）
cat > /etc/systemd/system/ssh-auto-upgrade.service << EOF
[Unit]
Description=SSH Auto Upgrade Service
After=network.target

[Service]
Type=simple
ExecStart=$INSTALL_DIR/$EXECUTABLE_NAME --daemon
Restart=always
RestartSec=60
User=root

[Install]
WantedBy=multi-user.target
EOF

# 重新加载systemd配置
systemctl daemon-reload

echo "安装完成！"
echo "使用方法:"
echo "  $EXECUTABLE_NAME --help"
echo "  systemctl start ssh-auto-upgrade  # 启动服务"
echo "  systemctl enable ssh-auto-upgrade  # 设置开机自启"
"""
    
    with open(f"{package_dir}/install.sh", "w") as f:
        f.write(install_script)
    os.chmod(f"{package_dir}/install.sh", 0o755)
    
    # 创建README
    readme = """# SSH自动升级工具 - 独立版本

这是一个独立的可执行文件版本，无需安装Python环境或任何依赖。

## 安装方法

```bash
sudo ./install.sh
```

## 使用方法

```bash
# 查看帮助
ssh-auto-upgrade --help

# 手动运行
sudo ssh-auto-upgrade

# 作为服务运行
sudo systemctl start ssh-auto-upgrade
sudo systemctl enable ssh-auto-upgrade
```

## 功能特点

- 自动检测OpenSSH版本
- 自动下载和编译最新版本
- 支持配置文件管理
- 支持systemd服务管理
- 无需Python环境依赖

## 系统要求

- Linux系统（支持systemd）
- root权限
- 网络连接
"""
    
    with open(f"{package_dir}/README.md", "w") as f:
        f.write(readme)
    
    # 创建压缩包 - 使用正确的格式名称
    shutil.make_archive("dist/ssh-auto-upgrade-standalone", "gztar", package_dir)
    print(f"分发包已创建: dist/ssh-auto-upgrade-standalone.tar.gz")

def main():
    """主函数"""
    print("=== SSH自动升级工具 - 独立打包脚本 ===")
    
    # 检查Python版本
    if sys.version_info < (3, 6):
        print("错误: 需要Python 3.6或更高版本")
        sys.exit(1)
    
    # 安装PyInstaller
    if not install_pyinstaller():
        sys.exit(1)
    
    # 构建可执行文件
    if not build_executable():
        sys.exit(1)
    
    # 创建分发包
    create_distribution_package()
    
    print("\n=== 打包完成 ===")
    print("输出文件:")
    print("  - dist/ssh-auto-upgrade-standalone.tar.gz")
    print("  - dist/standalone/ssh-auto-upgrade")
    print("\n使用方法:")
    print("  1. 解压分发包")
    print("  2. 运行 sudo ./install.sh 安装")
    print("  3. 使用 ssh-auto-upgrade 命令运行程序")

if __name__ == "__main__":
    main()